home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / ASSEMBLER / BAOF / DemoNotes
Text File  |  1994-10-26  |  25KB  |  627 lines

  1. ===========================================================================
  2.                         BasicAOF version 1.20
  3.                 © Oregan Software Developments 1994
  4. ===========================================================================
  5.  
  6. NOTE: This demonstration version of BasicAOF can only process the supplied
  7. example files. This demo may be copied and given to others provided no
  8. charge is made and all the files are copied and are unaltered in any way. PD
  9. libraries may supply this demo as long as they do not charge more than £2
  10. for a single disc including P&P.
  11.  
  12. BasicAOF is available now and costs £34.95 inclusive from:
  13.  
  14.         Oregan Developments
  15.         36 Grosvenor Avenue
  16.         Streetly : Sutton Coldfield  
  17.         B74 3PE      
  18.  
  19.         Tel: 0121 353 6044    (Access/Visa)
  20.  
  21. ---------------------------------------------------------------------------
  22.  
  23. BasicAOF is a software development tool that enables Basic assembler to
  24. export ARM Object Format (AOF) files.
  25.  
  26. These object files cannot be executed directly, but must first be linked
  27. using a linker. It is most efficient to construct larger and more complex
  28. programs from several object files, produced by BasicAOF and/or high level
  29. compilers (C, Pascal, Fortran etc)
  30.  
  31. Mixing assembler and high level languages allows the construction of top
  32. quality programs because you can take advantage of the strong points of both
  33. worlds. For instance, writing most of the code in C allows you to exploit
  34. the portability of C, the maintainability of C and the power of C libraries
  35. and language. On the other hand, writing critical portions of code in Basic
  36. assembler allows you to exploit all the speed of ARM processor and access
  37. directly hardware or operating system.
  38.  
  39. Basic assembler is very popular because it is inbuilt in RISC OS ROM and is
  40. interfaced with the BBC Basic interpreter in a way that allows for great
  41. versatility. BasicAOF enables Basic assembler to:
  42.  
  43.       • be invoked in multi-tasking mode
  44.       • save ARM Object Format files
  45.       • export global-scope symbols
  46.       • import external symbols
  47.       • relocate position-dependent code automatically at link time
  48.       • debug from Basic environment, in-memory-assembled code using Desktop
  49.         Debugger Tool (DDT)
  50.       • re-assemble AOF files produced from C compiler or other code
  51.         generators using DsasmBAOF disassembler
  52.  
  53. Combining Basic assembler and BasicAOF you can use all the features provided
  54. in conventional assemblers and more besides, as the Basic interpreter has
  55. greater flexibility:
  56.  
  57.       • repetitive assembly
  58.       • macro assembly
  59.       • conditional assembly
  60.       • global and local label capability
  61.       • comprehensive expression handling (including floating point
  62.         expressions)
  63.       • rich operator and function set (including indirection operators)
  64.       • save any section of memory as AOF
  65.       • encapsulation of any binary file in generated AOF (e.g you can load
  66.         a spritefile and generate exported symbols for the address of each
  67.         sprite, or load a template definition and create a relocatable AOF
  68.         with symbols for each window)
  69.       • Implementation of code generators facility (e.g. create optimised
  70.         code plotting a particular sprite)
  71.  
  72. You can find all the above features demonstrated in the example programs
  73. supplied.
  74.  
  75.  
  76. References and terminology
  77. ==========================
  78.  
  79. It is assumed that reader is familiar with the following topics:
  80.  
  81.      a) definition of APCS
  82.      b) using Link DDE tool
  83.      c) using Make/AMU DDE tools
  84.      d) using DDT debugger
  85.      e) using BBC Basic Assembler
  86.  
  87. Topics a), b), c), d) are addressed in Desktop Development Environment User
  88. Guide published by Acorn Computers Ltd.
  89.  
  90. Topics a), b), e) are addressed in Appendixes of RISC OS 2/3 Programmer's
  91. Reference Manual published by Acorn Computers Ltd.
  92.  
  93. The following terms and abbreviations are often used in the text:
  94.  
  95. AIF
  96.         Application Image Format. Executable RISC OS applications produced
  97.         by Link DDE tool.
  98.  
  99. ALF
  100.         Acorn Library Format. A collection of AOF files constructed from a
  101.         set of AOF files by the LibFile DDE tool.
  102.  
  103. AMU
  104.         Acorn Make Utility DDE tool. It is a tool managing the construction
  105.         of executable program images, modules and libraries. It avoids
  106.         needless re-processing of unaltered source files and ensures
  107.         consistent construction using operations and dependencies specified
  108.         in a Makefile.
  109.  
  110. AOF
  111.         ARM Object Format. A code file format generated by BasicAOF,
  112.         compilers and assemblers.
  113.  
  114. APCS
  115.         ARM Procedure Call Standard. This is a contract between two
  116.         procedures, one calling the other. The called procedure needs to
  117.         know which registers it can freely change without restoring them
  118.         before returning, and the caller needs to know which registers it
  119.         can rely on not being corrupted over a procedure call. Additionally
  120.         both procedures need to know which registers contain input arguments
  121.         and return arguments, and the arrangement of stack backtrace data.
  122.         Writing assembly language procedures that obey APCS is the key to
  123.         interworking C and assembler.
  124.  
  125. DDE
  126.         Desktop Development Environment. An extendable set of RISC OS
  127.         Desktop tools for developing applications and relocatable modules,
  128.         developed by Acorn Computers Ltd.
  129.  
  130. DDT
  131.         Desktop Debugging Tool. An advanced interactive aid to debugging
  132.         programs written in compiled languages and/or ARM assembler.
  133.  
  134. Libfile
  135.         A library management DDE tool. It can be used to create and maintain
  136.         library archives (ALF files).
  137.  
  138. Link
  139.         The ARM linker tool supplied as part of DDE. Link tool accepts a set
  140.         of AOF and ALF files as input and produces an AIF executable or a
  141.         Relocatable Module as output.
  142.  
  143. Make
  144.         An interactive DDE tool that aids the programmer in the construction
  145.         and maintenance of Makefiles.
  146.  
  147. Objasm
  148.         ARM AOF assembler developed by Acorn Computers Ltd forming part of
  149.         the Desktop Assembler product.
  150.  
  151. RISC_OSLib
  152.         A library supplied with Acorn's ANSI C compiler, designed to help
  153.         program applications to run under the desktop.
  154.  
  155.  
  156.  
  157. Loading BasicAOF
  158. ================
  159.  
  160. BasicAOF is compatible with RISC OS 2 and RISC OS 3 and needs SharedCLibrary
  161. module version 3.75 or later. When you double click the !BasicAOF icon,
  162. BasicAOF will be installed as a relocatable module.
  163.  
  164. It is assumed you have already installed DDE on your system in order to be
  165. able to use linking and managed compilation facilities. Programmers who want
  166. to program only using BasicAOF without using any compiled language, at least
  167. should install Link tool and Make/AMU tool from DDE tools.
  168.  
  169. BasicAOF has extremely low memory requirements. Resident program code and
  170. workspace consume less than 19Kb in module area and memory is dynamically
  171. allocated, so more memory will be used only if really needed. As a result it
  172. is quite usable on smaller machines (1 MB RAM and floppy disc)
  173.  
  174.  
  175.  
  176. Using BasicAOF
  177. ==============
  178.  
  179. There are many features in BasicAOF but it is not possible to document the
  180. program fully in these notes. BasicAOF provides several SWIs for use in
  181. Basic assembler programs. The calls that probably will be used more
  182. frequently are:
  183.  
  184.         SYS "BasicAOF_Export"
  185.         SYS "BasicAOF_SaveAOF"
  186.  
  187. You can also call some BasicAOF SWIs via assembler macros that call directly
  188. the appropriate SWIs. Such macros are:
  189.  
  190.         FNimport(symbol$)
  191.         FNweak(symbol$)
  192.         FNreloc(label%)
  193.         FNdebug(address%)
  194.  
  195. Let's demonstrate some of the above calls in a minimal example:
  196.  
  197.         REM >Prog1
  198.         DIM code% 1000, L%-1
  199.         FOR pass=8 TO 10 STEP 2:P%=code%:[OPT pass
  200.         .beep
  201.                 MOV     r0, #7
  202.                 SWI     "OS_WriteC"
  203.                 MOVS    pc, r14
  204.         ]:NEXT
  205.  
  206. To export this trivial procedure with name "beep_proc" we should append the
  207. following line in the end of the program:
  208.  
  209.         SYS "BasicAOF_Export", "beep_proc", beep
  210.  
  211. However this statement does not actually save the AOF file, thus after
  212. exporting all the symbols we want, we should add the following line:
  213.  
  214.         SYS "BasicAOF_SaveAOF", code%, P%
  215.  
  216. This call specifies the start address of code and the end address of code.
  217. If the Basic source resides in 's' directory, the resulting AOF file will be
  218. saved in 's.^.o' directory.
  219.  
  220. The exported procedure "beep_proc" can now be called from other C or
  221. Assembler programs such as the one below:
  222.  
  223.         REM >Prog2
  224.         DIM code% 1000, L%-1
  225.         FOR pass=8 TO 10 STEP 2:P%=code%:[OPTpass
  226.         .entry_address
  227.                 BL      FNimport("beep_proc")
  228.                 SWI     "OS_Exit"
  229.         ]:NEXT
  230.         SYS "BasicAOF_SaveAOF", code%, P%,,, entry_address
  231.         END
  232.         DEF FNimport(symbol$)
  233.         IF (pass AND 2) SYS "BasicAOF_Import", symbol$, P%
  234.         =0
  235.  
  236. Here we have used FNimport() macro to call the symbol that was exported from
  237. Prog1. We have also specified an entry address which is the execution
  238. address for the whole program contained in these two short source files.
  239.  
  240. In order to obtain the final executable, we must run the programs s.Prog1
  241. and s.Prog2 and then link the object files using the following command:
  242.  
  243.         Link -o !RunImage o.Prog1 o.Prog2
  244.  
  245. Please note that code or data contained in AOF files must be relocatable,
  246. because the linker will position the contents of object files at an
  247. arbitrary location in the final executable. Thus if the code contains
  248. position dependent data (absolute pointers etc), you can use FNreloc to
  249. provide automatic relocation at linking stage. Instead of writing 'DCD
  250. pointer%' write 'DCD FNreloc(pointer%)' in your code, where pointer% is a
  251. program-relative address.
  252.  
  253.  
  254.  
  255. Working styles
  256. ==============
  257.  
  258. • Unmanaged Development
  259.  
  260. If you want to assemble a Basic source in unmanaged development style, just
  261. double click on the Basic file to run it. The AOF file produced will be
  262. saved with the default filename described above. This style can offer the
  263. quickest way of constructing small and simple programs.
  264.  
  265. • Managed Development
  266.  
  267. This working style makes use of Makefiles to manage the construction of your
  268. programs. The DDE tools Make and AMU can both execute the commands in a
  269. Makefile running other tools to perform the make job. The Make tool also
  270. constructs Makefiles for you, avoiding the need for you to understand their
  271. syntax, and making it quick and easy to do this.
  272.  
  273. The main advantages of managed development are that no unnecessary
  274. reprocessing of unaltered program sources is performed and programs are
  275. constructed consistently even when run by different people on different
  276. systems. These advantages make managed development the best style for the
  277. development of larger programs with code split into several source files.
  278.  
  279. In order to use BasicAOF through Make/AMU, the Basic assembler sources must
  280. reside in a directory named 's' inside your Work Directory. An Objasm
  281. command will be invoked from AMU that will be trapped if the source is a
  282. Basic file and this file will be executed. Otherwise Objasm will be called
  283. with identical arguments. As a result mixed processing of BasicAOF and
  284. Objasm assembler sources is enabled.
  285.  
  286. In addition please note that in managed development style, the Basic
  287. assembler multitasks under the RISC OS desktop, allowing other tasks to
  288. proceed while it operates.
  289.  
  290.  
  291.  
  292. DDT debugging
  293. =============
  294.  
  295. If you wish to debug your final executable program with the DDT debugger,
  296. Link tool must be invoked with Debug option selected.
  297.  
  298. Executing a binary produced in the above way, or dragging it onto the DDT
  299. icon starts a debugging session on it. Of course debugging will be at
  300. machine level (i.e. displaying the current execution position on a
  301. disassembly of memory).
  302.  
  303. All global-scope symbols exported with BasicAOF will be shown in the DDT
  304. disassembling window. If you want to add more local-scope symbols to aid
  305. debugging, use SWI BasicAOF_Keep.
  306.  
  307. Also please note that SWI BasicAOF_Debug provides a direct call to DDT from
  308. Basic assembler without forcing you to link the final executable program.
  309. Consequently testing and debugging a Basic assembler routine is made much
  310. easier and faster. You can see example '!BasicDDT' to understand how
  311. BasicAOF_Debug is used via FNdebug(address%) macro.
  312.  
  313.  
  314.  
  315. Making your own linkable libraries
  316. ==================================
  317.  
  318. Linkable libraries (ALF files) are collections of many AOF files stored in
  319. one file. When presented to linker as an input file, the referenced object
  320. files within a library are linked onto the output executable, but those not
  321. needed are left out. A linkable library is therefore a recommended way of
  322. storing a selection of useful procedures for re-use in a number of programs.
  323. You may well find that this facility can save you a lot of  time by avoiding
  324. continually 'reinventing the wheel'. You will need the Libfile DDE tool to
  325. construct and modify linkable libraries.
  326.  
  327. You can collect object files produced with BasicAOF in libraries. If you
  328. want to interwork your routines with other compiled languages like C, they
  329. must obey APCS.
  330.  
  331.  
  332.  
  333. Utilities
  334. =========
  335.  
  336. The full version of the package includes also DsasmBAOF, a typical
  337. non-interactive DDE tool that disassembles AOF files and generates BasicAOF
  338. assembler source files. The program uses all available information to
  339. construct the closest representation of the original source and handles
  340. automatically the following data contained in AOF file:
  341.  
  342.       • Global and local symbol information
  343.       • Relocation directives (type 1 PC-relative & additive)
  344.       • Automatic handling of Bcc/BLcc instructions
  345.       • Automatic handling of instructions ADRcc Rx,label/LDRcc Rx,label
  346.       • Automatic generation of appropriate labels
  347.       • Automatic handling of ASCII literal strings
  348.       • Supports CODE, DATA and NOINIT areas. DEBUG areas are ignored.
  349.       • FPE instructions displayed as data and comments
  350.       • APCS-RISC OS register bindings used for displaying assembler output
  351.  
  352. You can examine AOF files extracted from libraries like RISC_OSLib or
  353. AnsiLib. DsasmBAOF is also useful for converting C programs to Basic
  354. assembler, in order to optimise or modify the generated code.
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361. BasicAOF Examples
  362. =================
  363.  
  364. If you want to understand quickly how BasicAOF is used, you can study the
  365. supplied well-documented example programs.
  366.  
  367. Please note that considerable effort has been expended to provide useful and
  368. non-trivial examples, to demonstrate all features of BasicAOF with C
  369. compiler or standalone. All examples are cases where ARM code is essential
  370. for speed or low-level reasons.
  371.  
  372. If you want to re-build the example programs double click on the relevant
  373. Makefile inside each Work Directory. The following sections describe the
  374. interesting points demonstrated in example programs:
  375.  
  376.  
  377. Wave3d
  378. ======
  379.  
  380. This is the simplest example as far as BasicAOF is concerned. The program
  381. consists of three short assembler sources and a main C source.
  382.  
  383. s.intsqr
  384.         This is a leaf procedure (one that calls no other procedures)
  385.         computing the square root of an unsigned 32 bit number. It has been
  386.         thoroughly optimised because it is called more than 2500 times per
  387.         frame. This is a typical example of a procedure that must be written
  388.         in ARM assembler for efficiency reasons.
  389.  
  390. s.blitlines
  391.         A simple procedure clearing video ram extremely fast. C code can not
  392.         achieve the speed obtained with ARM assembler, when reading or
  393.         writing memory blocks.
  394.  
  395. s.Sin
  396.         In this example, floating point expressions and indirection
  397.         operators are used to access memory directly, in order to construct
  398.         a lookup table of fixed point Sine values.
  399.  
  400.         This particular example can't be written in a conventional
  401.         assembler. The closest you can get, is to write a program to create
  402.         a binary file that will be loaded at assembly/run time, a technique
  403.         which does not fit well in the automatic process of managed
  404.         compilation.
  405.  
  406.  
  407.  
  408. UnSqueeze
  409. =========
  410.  
  411. s.call_unsq
  412.         A low-level procedure obeying APCS that calls code which corrupts
  413.         all 16 ARM registers. Such low-level operations can not be easily
  414.         written in C, but are simple in assembly.
  415.  
  416.  
  417.  
  418. Wallpaper
  419. =========
  420.  
  421. s.Wallpaper
  422.         Here is demonstrated, how to develop and debug an assembler routine
  423.         in Basic environment and then export it with BasicAOF. Developing
  424.         and debugging code is much easier in Basic environment compared with
  425.         a conventional assembler, because you don't have to modify the
  426.         source file, invoke the assembler, link a routine that will supply
  427.         parameters to the developed procedure and finally run the
  428.         executable.
  429.  
  430.         Modify variable debug% and run the program to see the routine
  431.         executed in Basic. In addition you can see how macro assembly and
  432.         conditional assembly can be implemented in Basic assembler.
  433.  
  434.  
  435.  
  436. Bases
  437. =====
  438.  
  439. s.Bases
  440.         This is a simple multi-tasking RISC OS application, contained in a
  441.         short Basic assembler source file. However all Wimp handling is
  442.         performed calling functions from RISC_OSLib, a library developed in
  443.         C by Acorn.
  444.  
  445.         All RISC_OSLib and SharedCLibrary functions are called via
  446.         FNimport() macro. The only exported symbol is "main" which is the
  447.         name of the entry function in any C program.
  448.  
  449.  
  450.  
  451. Parallax
  452. ========
  453.  
  454. s.blitstripe
  455.         This is a procedure obeying APCS which has 6 input arguments and
  456.         here is demonstrated how to load 5th and 6th arguments from stack.
  457.  
  458.         Additionally FNreloc() macro is used to relocate an array of
  459.         pointers. Repetitive assembly and macro assembly are used in this
  460.         example too.
  461.  
  462.         Also please note that symbol "screenbase" exported in this source is
  463.         not a function, but an integer variable that will be initialised in
  464.         the C part of program.
  465.  
  466.  
  467. s.ShiftPic
  468.         In this example, a spritefile is loaded in memory and three shifted
  469.         copies are created. Subsequently the bitmap addresses of each sprite
  470.         are exported.
  471.  
  472.         Using this technique you can encapsulate any binary file (optionally
  473.         processing it in any way) within an AOF file that will be linked
  474.         into the executable.
  475.  
  476.         This will allow you to include data, text, sprites, templates,
  477.         drawfiles etc. inside the !RunImage file of your application. In
  478.         addition you can use FNreloc() macro to convert any datafile
  479.         containing pointers, into a relocatable AOF file that can be
  480.         positioned by the linker anywhere in the final executable (for
  481.         example Template files).
  482.  
  483.         Also please note that in '!Parallax.Makefile' we have established a
  484.         dependency between 's.ShiftPic' assembler source and 'dat.Picture’
  485.         sprite file. As a result, whenever the sprite file is altered,
  486.         Make/AMU will re-assemble 's.ShiftPic'.
  487.  
  488.  
  489.  
  490. Exiter
  491. ======
  492.  
  493. You can assemble a module from a set of source files, a link step being
  494. required to join the produced AOF files to form the usable relocatable
  495. module. Exiter is a relocatable module split into three assembler sources. C
  496. language is not used in this example.
  497.  
  498. The separation of routines into separately assembled files has many
  499. advantages (e.g. better maintenance and debugging) . Additionally since DDT
  500. cannot be used to debug modules, it can be useful to link routines into test
  501. applications, debug them with DDT, then link them into the module.
  502.  
  503. It is a good idea to construct a module with the module header and the small
  504. routines/data associated with it in one source file, to be linked with the
  505. other source files forming the body of the module.
  506.  
  507. s.RM_Header
  508.         This is a general module header which you can adjust to form the
  509.         headers of other relocatable modules. This module header file must
  510.         be linked so that it is placed first in the module binary. To do
  511.         this you should use the following statement:
  512.  
  513.         SYS "BasicAOF_SaveAOF", code%, P%, "!!!Module$$Header",&2202
  514.  
  515.         Provided that areas are sorted by type and name, a name beginning
  516.         with '!' is placed before an alphabetic name, so the above call can
  517.         be used to ensure first placing.
  518.  
  519.         The module header source needs to contain FNimport() macros making
  520.         available any symbols referenced in the module body. In addition,
  521.         the initialisation routine should call, before anything else,
  522.         __RelocCode, a routine added by the linker which relocates any
  523.         absolute references to symbols when the module is initialised.
  524.  
  525.  
  526. s.ModuleBody
  527.         Main section of module, comprising of Start, Initialisation,
  528.         Finalisation and Service handlers.
  529.  
  530.  
  531. s.Keyevent
  532.         The useful part of module. You can easily alter this part in order
  533.         to perform other tasks like screen grabbing, volume control etc.
  534.  
  535.  
  536.  
  537. ColorBars
  538. =========
  539.  
  540. This is an example demonstrating some advanced uses of BasicAOF. It consists
  541. of five assembler sources and a main C part.
  542.  
  543. It is interesting to note that AOF file C:o.stubs, which contains the
  544. vectors of SharedCLibrary functions, is not linked in the final executable.
  545. Instead a minimal Run-Time System Kernel is used to interface C with
  546. operating system. As a result this C program is self-contained and does not
  547. require SharedCLibary module or AnsiLib library. This can be very useful in
  548. some situations.
  549.  
  550. s.miniRTSK
  551.         This assembler source implements an absolutely minimal Run-Time
  552.         System Kernel that must be initialised before C "main" function is
  553.         entered. That's why an entry address is defined in this file, which
  554.         will be the execution address for the whole program.
  555.  
  556.         First of all we have to setup stack pointer (sp) and stack limit
  557.         (sl) registers, needed by C code. A simple descending non-extendable
  558.         stack is initialised and an appropriate stack overflow procedure is
  559.         defined. User may set the initial stack size by defining a global
  560.         variable in C named "stack_size". However if this variable is not
  561.         defined, a default stack size of 2Kb is set. In order to detect if
  562.         user has defined stack_size variable, symbol is referenced with
  563.         FNweak() macro. If you specify in C source a small stack size, stack
  564.         overflow error will be raised.
  565.  
  566.         Another interesting point is that in order to find the end of code
  567.         and data in the final executable, the predefined linker symbol
  568.         "Image$$RW$$Limit" is referenced. During linking stage, Link will
  569.         assign to this symbol the end address of read-write section of
  570.         image. As a result all memory above this address will not be used so
  571.         we can setup there our stack. You can find out more about Linker
  572.         pre-defined symbols, in DDE User Guide in the chapter titled "Link".
  573.  
  574.  
  575. s.xswi
  576.         This is a simple but fast SWI veneer, to interface C with operating
  577.         system SWI calls.
  578.  
  579.  
  580. s.Border
  581.         A procedure changing screen border colour by accessing directly VIDC
  582.         registers in SVC processor mode. Of course such low-level operations
  583.         must be written in assembler and not C. Please note that the border
  584.         colour is used as a CPU-load indicator.
  585.  
  586.  
  587. s.blitline
  588.         A solution to the problem of unique macro labels in Basic assembler.
  589.         Local label capability is incorporated in some conventional
  590.         assemblers, but with effective use of Basic interpreter, it can be
  591.         implemented in Basic assembler too.
  592.  
  593.  
  594. s.RGBmask
  595.         A very useful code generator example. In this example a sprite is
  596.         loaded in memory and specially optimised code depending on the
  597.         sprite shape, is generated and saved as an AOF file.
  598.  
  599.         In fact, using this technique you can implement simple compilers and
  600.         code generators producing AOF files via BasicAOF. For example you
  601.         can implement the CMHG (C Module Header Generator) using this
  602.         technique.
  603.  
  604.         Finally note that whenever the sprite file is modified, the
  605.         optimised code will be re-assembled, because we have established a
  606.         Makefile dependency similar to the !Parallax example.
  607.  
  608.  
  609.  
  610. BasicDDT
  611. ========
  612.  
  613. An example demonstrating how to call DDT interactive debugger from Basic
  614. environment to make debugging easier and faster.
  615.  
  616. You should have loaded DDT before running this program. After running the
  617. program, DDT is entered and registers R0-R13 have the same values setup by
  618. Basic's CALL/USR statement, i.e. R0-R7 = A%-H%.
  619.  
  620. In DDT you can singlestep instructions, set breakpoints or watchpoints,
  621. trace execution, change registers or memory contents, evaluate expressions
  622. etc.
  623.  
  624. When the end of assembler routine is reached, you should choose Quit entry
  625. from DDT's menu to return back to Basic environment. Registers R0-R13 after
  626. quitting DDT, are identical to the values on exit from routine.
  627.